package org.facyt.vacas.view.formulacion;

import javax.annotation.PostConstruct;

import org.facyt.commons.util.VaadinUtil;
import org.facyt.commons.view.interfaces.IWindow;
import org.facyt.vacas.util.ConstantesWeb;
import org.facyt.vacas.view.formulacion.bean.MateriaPrimaBean;
import org.facyt.vacas.view.formulacion.field.TipoAnimalComboBox;
import org.facyt.vacas.view.formulacion.popup.PopupMateriaPrimaFormulacion;
import org.facyt.vacas.view.formulacion.popup.PopupVerResultadoFormulacion;
import org.facyt.vacas.view.login.LoginPanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.vaadin.data.Container;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CustomLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.Window;

@Component("secure")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class FormulacionPanel extends Window implements IWindow,
		ItemClickListener {

	private static final long serialVersionUID = 3516303139129648606L;

	protected final Logger logger = LoggerFactory.getLogger(LoginPanel.class);
	
	protected Table grillaMateriaPrima = null;
	protected MateriaPrimaBean rowSeleccionado = null;
	private TextField pesoVivoTextField;
	private TextField produccionDiariaTextField;
	private TextField grasaLecheTextField;
	private TextField proteinaBrutaTextField;
	private TextField promedioDiaLactanciaTextField;
	private TextField distanciaCaminaTextField;
	private TextField estressPorCalorTextField;
	private TextField diasGestacionTextField;
	private TextField pesoFetoTextField;
	private TextField aumentoDiarioPesoVivoTextField;
	
	@Autowired
	private TipoAnimalComboBox tipoAnimalComboBox;
	
	@Autowired
	private PopupVerResultadoFormulacion popupVerResultadoFormulacion; 
	
	protected final String[] COLUMN_HEADER = {
			VaadinUtil.getProperties("formulacion.tabla.materia.prima.label"),
			VaadinUtil.getProperties("formulacion.tabla.costo.label"),
			VaadinUtil.getProperties("formulacion.tabla.iguala.label"),
			VaadinUtil.getProperties("formulacion.tabla.masde.label"),
			VaadinUtil.getProperties("formulacion.tabla.menosde.label") };

	protected final Object[] VISIBLE_COLUMN = {
			MateriaPrimaBean.NombreAtributos.MATERIA_PRIMA_DESCRIPCION,
			MateriaPrimaBean.NombreAtributos.COSTO,
			MateriaPrimaBean.NombreAtributos.IGUAL_A,
			MateriaPrimaBean.NombreAtributos.MENOS_DE,
			MateriaPrimaBean.NombreAtributos.MAS_DE };

	@Autowired
	private PopupMateriaPrimaFormulacion agregarMateriaPrimaWindow;

	public FormulacionPanel() {
		super();
	}

	@PostConstruct
	public void init() {
		setCaption(VaadinUtil
				.getProperties(ConstantesWeb.FacytApplication.TITULO_PAGINA));
		try {
			CustomLayout formulacionLayout = new CustomLayout(
					FormulacionPanel.class
							.getResourceAsStream("/template/formulacion.html"));

			agregarCompontestIzquierdos(formulacionLayout);
			agregarComponentesDerechos(formulacionLayout);
			agregarComponentesPorDebajo(formulacionLayout);

			addComponent(formulacionLayout);
			formulacionLayout.setSizeFull();

			inicializarDatos();
		} catch (Exception e) {
			logger.error("ERROR", e);
		}

	}

	protected void inicializarDatos() {
	
	}

	/**
	 * Se agregan los botones de abajo
	 * 
	 * @param formulacionLayout
	 */
	protected void agregarComponentesPorDebajo(CustomLayout formulacionLayout) {
		Button botonBorrarDatos = new Button();
		botonBorrarDatos.setCaption(VaadinUtil
				.getProperties("formulacion.boton.borrarDatos"));
		botonBorrarDatos.setStyleName("debajo");
		botonBorrarDatos.addListener(new ClickListener() {
			
			@Override
			public void buttonClick(ClickEvent event) {
				borrarTodosLosDatos();
				
			}
		});
		formulacionLayout.addComponent(botonBorrarDatos, "boton-borrar-datos");

		Button botonCargarArchivos = new Button();
		botonCargarArchivos.setCaption(VaadinUtil
				.getProperties("formulacion.boton.cargar.archivos"));
		botonCargarArchivos.setStyleName("debajo");
		formulacionLayout.addComponent(botonCargarArchivos,
				"boton-cargar-archivos");

		Button botonGuardar = new Button();
		botonGuardar.setCaption(VaadinUtil
				.getProperties("formulacion.boton.guardar"));
		botonGuardar.setStyleName("debajo");
		formulacionLayout.addComponent(botonGuardar, "boton-guardar");

		Button botonFormular = new Button();
		botonFormular.setCaption(VaadinUtil
				.getProperties("formulacion.boton.formular"));
		botonFormular.setStyleName("debajo");
		formulacionLayout.addComponent(botonFormular, "boton-formular");
		botonFormular.addListener(new ClickListener() {
			
			@Override
			public void buttonClick(ClickEvent event) {
				formular();
				
			}
		});

		Button botonSalir = new Button();
		botonSalir.setCaption(VaadinUtil
				.getProperties("formulacion.boton.salir"));
		botonSalir.setStyleName("debajo");
		formulacionLayout.addComponent(botonSalir, "boton-salir");
	}

	/**
	 * Se agrega la columna derecha
	 * 
	 * @param formulacionLayout
	 */
	protected void agregarComponentesDerechos(CustomLayout formulacionLayout) {
		agregarGrillaMateriaPrima(formulacionLayout);
		agregarBotoneraDerecha(formulacionLayout);
	}

	protected void agregarGrillaMateriaPrima(CustomLayout formulacionLayout) {
		grillaMateriaPrima = new Table();
		configurarGrilla();

		formulacionLayout.addComponent(grillaMateriaPrima,
				"grilla-materia-prima");
	}

	protected void configurarGrilla() {
		grillaMateriaPrima.setWidth(100, UNITS_PERCENTAGE);
		grillaMateriaPrima.setPageLength(getPageLength());
		// Allow selecting items from the table.
		grillaMateriaPrima.setSelectable(true);
		// Send changes in selection immediately to server.
		grillaMateriaPrima.setImmediate(true);
		grillaMateriaPrima.setColumnCollapsingAllowed(false);
		grillaMateriaPrima.addListener(this);
		grillaMateriaPrima.setNullSelectionAllowed(false);
		grillaMateriaPrima.addStyleName("grilla-materia-prima");

		// table DataSource
		grillaMateriaPrima.setContainerDataSource(getContainerDataSource());

		// visible columns
		grillaMateriaPrima.setVisibleColumns(getVisibleColumns());

		// String Columns headers
		grillaMateriaPrima.setColumnHeaders(getColumnHeaders());

	}
	
	public void agregarMateriaPrima(MateriaPrimaBean materiaPrimaBean){
		grillaMateriaPrima.getContainerDataSource().addItem(materiaPrimaBean);
		grillaMateriaPrima.refreshRowCache();
		grillaMateriaPrima.requestRepaint();
	}

	private String[] getColumnHeaders() {
		return COLUMN_HEADER;
	}

	protected Object[] getVisibleColumns() {
		return VISIBLE_COLUMN;
	}

	protected Container getContainerDataSource() {
		return new BeanItemContainer<MateriaPrimaBean>(MateriaPrimaBean.class);
	}

	protected int getPageLength() {
		return 20;
	}

	/**
	 * 
	 * @param formulacionLayout
	 */
	protected void agregarBotoneraDerecha(CustomLayout formulacionLayout) {
		Button botonAgregarMp = new Button();
		botonAgregarMp.setCaption(VaadinUtil
				.getProperties("formulacion.boton.agregar.mp"));
		botonAgregarMp.setStyleName("boton-derecha");
		botonAgregarMp.addListener(new Button.ClickListener() {
			
			@Override
			public void buttonClick(ClickEvent event) {
				agregarCargarMateriaPrima(true);
			}
		});
		formulacionLayout.addComponent(botonAgregarMp, "boton-agregar-mp");

		Button botonQuitarMp = new Button();
		botonQuitarMp.setCaption(VaadinUtil
				.getProperties("formulacion.boton.quitar.mp"));
		botonQuitarMp.setStyleName("boton-derecha");
		botonQuitarMp.addListener(new Button.ClickListener() {

			@Override
			public void buttonClick(ClickEvent event) {
			
				quitarElementoSeleccionado();

			}
		});
		formulacionLayout.addComponent(botonQuitarMp, "boton-quitar-mp");

		Button botonVerMp = new Button();
		botonVerMp.setCaption(VaadinUtil
				.getProperties("formulacion.boton.ver.mp"));
		botonVerMp.setStyleName("boton-derecha");
		formulacionLayout.addComponent(botonVerMp, "boton-ver-mp");

	}
	
	

	/**
	 * Se agrega la columna izquierda
	 * 
	 * @param formulacionLayout
	 */
	protected void agregarCompontestIzquierdos(CustomLayout formulacionLayout) {

		Label label = new Label(
				VaadinUtil
						.getProperties("formulacion.ingrese.datos.animal.label"));
		formulacionLayout.addComponent(label, "label-ingrese-datos-animal");

		formulacionLayout.addComponent(tipoAnimalComboBox, "tipo-animal-combo");

		pesoVivoTextField = new TextField();
		pesoVivoTextField.addStyleName("col-izq-form");
		pesoVivoTextField.setCaption(VaadinUtil
				.getProperties("formulacion.peso.vivo.label"));
		formulacionLayout
				.addComponent(pesoVivoTextField, "peso-vivo-textfield");

		produccionDiariaTextField = new TextField();
		produccionDiariaTextField.setCaption(VaadinUtil
				.getProperties("formulacion.produccion.diaria.label"));
		produccionDiariaTextField.addStyleName("col-izq-form");
		formulacionLayout.addComponent(produccionDiariaTextField,
				"produccion-diaria-textfield");

		grasaLecheTextField = new TextField();
		grasaLecheTextField.addStyleName("col-izq-form");
		grasaLecheTextField.setCaption(VaadinUtil
				.getProperties("formulacion.grasa.leche.label"));
		formulacionLayout.addComponent(grasaLecheTextField,
				"grasa-leche-textfield");

		proteinaBrutaTextField = new TextField();
		proteinaBrutaTextField.addStyleName("col-izq-form");
		proteinaBrutaTextField.setCaption(VaadinUtil
				.getProperties("formulacion.proteina.leche.label"));
		formulacionLayout.addComponent(proteinaBrutaTextField,
				"proteina-bruta-textfield");

		promedioDiaLactanciaTextField = new TextField();
		promedioDiaLactanciaTextField.addStyleName("col-izq-form");
		promedioDiaLactanciaTextField.setCaption(VaadinUtil
				.getProperties("formulacion.promedio.dias.lactancia.label"));
		formulacionLayout.addComponent(promedioDiaLactanciaTextField,
				"promedio-dia-lactancia-textfield");

		distanciaCaminaTextField = new TextField();
		distanciaCaminaTextField.addStyleName("col-izq-form");
		distanciaCaminaTextField.setCaption(VaadinUtil
				.getProperties("formulacion.distancia.camina.label"));
		formulacionLayout.addComponent(distanciaCaminaTextField,
				"distancia-camina-textfield");

		estressPorCalorTextField = new TextField();
		estressPorCalorTextField.addStyleName("col-izq-form");
		estressPorCalorTextField.setCaption(VaadinUtil
				.getProperties("formulacion.estres.calor.label"));
		formulacionLayout.addComponent(estressPorCalorTextField,
				"estres-calor-textfield");

		diasGestacionTextField = new TextField();
		diasGestacionTextField.addStyleName("col-izq-form");
		diasGestacionTextField.setCaption(VaadinUtil
				.getProperties("formulacion.dias.gestacion.label"));
		formulacionLayout.addComponent(diasGestacionTextField,
				"dias-gestacion-textfield");

		pesoFetoTextField = new TextField();
		pesoFetoTextField.addStyleName("col-izq-form");
		pesoFetoTextField.setCaption(VaadinUtil
				.getProperties("formulacion.peso.feto.label"));
		formulacionLayout
				.addComponent(pesoFetoTextField, "peso-feto-textfield");

		aumentoDiarioPesoVivoTextField = new TextField();
		aumentoDiarioPesoVivoTextField.addStyleName("col-izq-form");
		aumentoDiarioPesoVivoTextField.setCaption(VaadinUtil
				.getProperties("formulacion.aumento.diario.peso.vivo.label"));
		formulacionLayout.addComponent(aumentoDiarioPesoVivoTextField,
				"aumento-diario-peso-vivo-textfield");

	}

	public MateriaPrimaBean getRowSeleccionado() {
		return rowSeleccionado;
	}
	
	public void quitarElementoSeleccionado(){
		if (rowSeleccionado != null){
			grillaMateriaPrima.getContainerDataSource().removeItem(rowSeleccionado);
			rowSeleccionado = null;
		}
	}

	@Override
	public void itemClick(ItemClickEvent event) {
		if (event.isDoubleClick()){
			if (rowSeleccionado != null){
				agregarCargarMateriaPrima(false);
			}
		}else{
			rowSeleccionado = (MateriaPrimaBean) grillaMateriaPrima.getValue();	
		}
		
	}
	
	
	protected void borrarTodosLosDatos(){
		pesoVivoTextField.setValue("");
		produccionDiariaTextField.setValue("");
		grasaLecheTextField.setValue("");
		proteinaBrutaTextField.setValue("");
		promedioDiaLactanciaTextField.setValue("");
		distanciaCaminaTextField.setValue("");
		estressPorCalorTextField.setValue("");
		diasGestacionTextField.setValue("");
		pesoFetoTextField.setValue("");
		aumentoDiarioPesoVivoTextField.setValue("");
		tipoAnimalComboBox.setValue(null);
		grillaMateriaPrima.getContainerDataSource().removeAllItems();
	}
	
	protected void agregarCargarMateriaPrima(boolean nuevo){
		if (!nuevo)
			agregarMateriaPrimaWindow.editarMateriaPrima(rowSeleccionado);
		
		addWindow(agregarMateriaPrimaWindow);
	}
	
	protected void formular(){
		addWindow(popupVerResultadoFormulacion);
	}

}
